<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Node;
use App\Models\Role;
use Illuminate\Http\Request;

class RoleController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $name = $request->get('name');

        // when方法搜索，当name不为空时 使用匿名函数，匿名函数使用外部变量 需要通过 use
        $data = Role::when($name, function ($query) use ($name) {
            $query->where('name', 'like', '%' . $name . '%');
        })->paginate($this->pathSize)->appends($request->all());

        /*  追加  ->appends($request->all())  分页并保留条件*/

        return view('admin.role.index', compact('data', 'name'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('admin.role.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {

        $data = $this->validate($request, [
            'name' => 'required|min:1|max:6|unique:roles',


        ]);

        $res = Role::create($data);
        if ($res) {

            return redirect(route('admin.role.index'));
        } else {

            return redirect(route('admin.role.create'))->withErrors("添加失败");
        }

    }

    /**
     * Display the specified resource.
     *
     * @param int $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param int $id
     * @return \Illuminate\Http\Response
     */
    public function edit(Role $role) //通过role  获取整个对象 注入 修改中
    {

        return view('admin.role.edit', compact('role'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param int $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Role $role)
    {
        $this->validate($request, [
            'name' => 'required|min:1|max:6|unique:roles',


        ]);
        $role->name = $request->get('name');
        $res = $role->save();
        if ($res) {

            return redirect(route('admin.role.index'));
        } else {


            return redirect(route('admin.role.edot'))->withErrors('修改错误');
        }


    }

    /**
     * Remove the specified resource from storage.
     *删除
     * @param int $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {

        $res = Role::destroy($id);

        if ($res) {
            return $this->writeJson(0, "[]", "删除角色成功");

        } else {
            return $this->writeJson(20001, "[]", "删除角色失败");

        }
    }

    /**$
     * 给角色分配权限 页面
     */
    public function node(Role $role, Request $request)
    {
        //先获取所有的节点权限
        $data = (new Node())->getNodeAll();
        //获取当前用户的节点权限
        //$role->nodes() 相当于 tp框架 with关联模型查询
        //pluck 获取字段内容为一个新的一维数组
        $roleNode = $role->nodes()->pluck('node_id')->toArray();

        //传递所有节点 页面展示
        //传递role 执行角色分配
        //传递当前用户节点 进行默认选中
        return view('admin.role.node', compact('data', 'role', 'roleNode'));
    }

    /**
     * 给角色分配权限 执行
     */
    public function nodeSave(Role $role, Request $request)
    {
        $node = $request->get('node');

        //循环入库写法
//        $node = [
//            1,3,4
//        ];
//        $role_id = 2;
//
//        foreach ($node as $val){
//            RoleNode::create([
//                'role_id'=>$role_id,
//                'node_id'=>$val
//            ]);
//        }

        //通过关联写入
        //toggle 会删除之前的数据 在写入新的内容
        //sync 同步关联 追加入库
        $res = $role->nodes()->sync($node);
        //写入成功，跳转到管理员列表页面
        if ($res) {
            return redirect(route("admin.role.index"));
        } else {
            //写入失败，还在当前页，来一个友好提示
            return redirect(route("admin.role.node",$role))->withErrors("分配权限失败");
        }

    }

}
